<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script>
            /* 
            思路：一般来说，括号匹配问题会用栈来匹配，注意，栈一般都是用来存放下标的  
            定义一个栈，存放括号对应的下标，如果遇到 ( 就入栈，遇到
            )就出栈，同时长度为当前下标-栈顶元素下标

            但是会遇到特殊情况:
            ( ) (())  )
            当遇到下标为6的 ) ，这时候又应该出栈，但是栈顶元素已经空了
            如何出栈呢？而且它应该计算的最长有效括号，目前只是4，但实际应该是6
            ()  (()),如果只是单纯的用右括号的下标-栈顶元素下标，那么前面的()已经出栈了，最长有效括号只能是4，所以有问题

            问题：因为无法记录之前已经出栈过的匹配成功的下标，因此往栈里提前存放一个下标-1
            遇到左括号还是进栈，遇到右括号还是先出栈,(如果栈内还有元素)，最长长度是当前下标-栈顶元素下标。如果这时候栈空了，那么就让右括号下标入栈

            -1 ()
            */
            var longestValidParentheses = function (s) {
                const stack = [-1]
                let res = 0
                for (let i = 0; i < s.length; i++) {
                    if (s[i] == "(") {
                        stack.push(i)
                    } else {
                        let topIndex = stack.pop()
                        if (stack.length) {
                            res = Math.max(res, i - stack[stack.length - 1])
                        } else {
                            stack.push(i)
                        }
                    }
                }
                return res
            }
        </script>
    </body>
</html>
